\newpage

\section*{Soluzioni}

\subsection*{Punto 1}
Per rendere riutilizzabile il codice, si \`e scelto di raggruppare le
interfacce delle classi create in \emph{header file}, mentre le
implementazioni si trovano nei corrispondenti \emph{source
file}. Come visto nell'esercitazione 3, alcune definizioni generali sono
raggruppate nel seguente \emph{header 
file}: 
%
\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting{./es/1/src/rootfinding.hpp}
\lstset{basicstyle=\sf}

In questo caso, i nomi definiti da \cpp{rootfinding.hpp} sono
esportati nel \cpp{namespace} \cpp{Rootfinding}.

Si riportano di seguito i listati degli \emph{header file} e dei
\texttt{source files} che
contengono le definizioni delle classi \cpp{Bisection} e \cpp{Newton}.
% Bisection
\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Interfaccia della classe \cpp{Bisection}]{es/1/src/bisection.hpp}
\lstinputlisting[caption=Implementazione della classe \cpp{Bisection}]{es/1/src/bisection.cpp}
% Newton
\lstinputlisting[caption=Interfaccia della classe \cpp{Newton}]{es/1/src/newton.hpp}
\lstinputlisting[caption=Implementazione della classe \cpp{Newton}]{es/1/src/newton.cpp}
\lstset{basicstyle=\sf}


\subsection*{Punto 2}
% Robust
\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting[caption=Interfaccia della classe \cpp{Robust}]{es/1/src/robust.hpp}
\lstinputlisting[caption=Implementazione della classe \cpp{Robust}]{es/1/src/robust.cpp}
\lstset{basicstyle=\sf}

All'interno della struttura \cpp{robust} sono stati definiti i tipi
per il metodo globalmente convergente utilizzato per trovare
l'approssimazione grossolana della radice (\cpp{coarseT}) e per il
metodo di alto ordine utilizzato per raffinare la stima
(\cpp{fineT}). Ci\`o pu\`o essere utile qualora si desiderasse
cambiare uno dei due metodi, a patto, naturalmente, che la classe che
implementa il nuovo metodo abbia un'interfaccia compatibile con quella
del metodo che sostituisce. Si provi, per esercizio, a scrivere
un'implementazione del metodo di Newton modificato e ad utilizzarlo
nella struttura \cpp{robust}. Si vedr\`a nel seguito che questa
tecnica pu\`o essere ulteriormente raffinata parametrizzando la classe
\cpp{Robust} rispetto ai due tipo \cpp{coarseT} e \cpp{fineT}
utilizzando la direttiva \cpp{template}.
Il grado di approssimazione dello zero richiesto al metodo grossolano
\`e definito come il prodotto della tolleranza finale \cpp{tol} per il
coefficiente \cpp{M\_cfratio} (\emph{coarse-to-fine ratio}).
I membri \emph{accessor} permettono di accedere accedere alle
 propriet\`a non modificabili dall'utente tramite un membro \cpp{const}.

Il file \cpp{Makefile}, che permette la  compilazione di \cpp{bisection},
\cpp{newton} e \cpp{robust}, produce una libreria statica
\cpp{librootfinding.a}. Una volta preparato il file di libreria, qualsiasi
codice che utilizzi questi metodi, come quello proposto al \emph{Punto 3}, pu\`o
essere compilato passando al compilatore il nome della libreria (tramite il
parametro \texttt{-lrootfinding}) e la sua posizione (\texttt{-Llib} in questo esempio).

Le strutture delle classi \cpp{bisection},
\cpp{newton} e \cpp{robust} hanno molte propriet\`a analoghe. Replicare
la definizione strutture simili \`e non solo inelegante, ma rischioso
qualora divenga importante %in un altro punto del codice
che le classi che implementano i diversi metodi abbiano un'interfaccia
omogenea. Una soluzione migliore consiste nel creare una classe base
\cpp{IterativeMethod} da cui derivare le implementazioni di ciascun
metodo. Si provi, per esercizio, ad implementare questa modifica nel
codice (\emph{Applicare quanto appreso nella lezione del 14 novembre sulla
ereditariet\`a}).
%
%\lstinputlisting{./es/bn.2.hpp}
%


\subsection*{Punto 3}
Si riporta di seguito il codice del \emph{main program} per la
soluzione del terzo punto. L'implementazione cui si fa riferimento
\`e quella relativa al listato riportato ai punti precedente.
\lstset{basicstyle=\scriptsize\sf}
\lstinputlisting{./es/1/bn.hpp}
\lstinputlisting{./es/1/bn.cpp}
\lstset{basicstyle=\sf}


 \subsection*{Punto 4}
  Si fornisce la soluzione relativa alla struttura \cpp{Robust}. Il
  sovraccaricamento dell'\cpp{operator<<} negli altri casi \`e del tutto
 analogo.
 \lstset{basicstyle=\scriptsize\sf}
 \lstinputlisting[linerange={15-30}]{./es/2/src/robust.cpp}
 \lstset{basicstyle=\sf}
 
 
 Si noti che la funzione che sovraccarica l'operatore di scorrimento
 accede ai membri privati della classe. Per questa ragione \`e
 necessario specificare che si tratta di una \emph{friend function}
 aggiungendo l'istruzione seguente all'interfaccia della classe:
 \begin{lstlisting}
 //! Display the results
 friend std::ostream& operator<<(std::ostream&, Robust&);
 \end{lstlisting}
 
 Per testare il codice scritto si pu\`o utilizzare il seguente \emph{main program}:
 %
 \lstset{basicstyle=\scriptsize\sf}
 \lstinputlisting{./es/2/bn.cpp}
 \lstset{basicstyle=\sf}
 %
 
 Compilando ed eseguendo il programma si ottiene il seguente \emph{output}:
 \begin{verbatim}
 0.707107
* Robust Method *
Tolerance           :   1e-06
Max # of iterations :   100
Convergence check   :   increment
# of iterations (C) :   3
# of iterations (F) :   4
C-to-F tol ratio    :   200000
\end{verbatim}
